package model

import (
	"gorm.io/gorm"
	"math"
)

type BaseModel struct {
	AddTime  int64 `gorm:"column:add_time;type:bigint(20) unsigned;not null;autoUpdateTime" json:"add_time"`
	LastTime int64 `gorm:"column:last_time;type:bigint(20) unsigned;not null;autoUpdateTime" json:"last_time"`
}

type PageRequest struct {
	Page     int `json:"page"`      //当前页码
	PageSize int `json:"page_size"` //每页数量
}

type Pagination struct {
	Page      int `json:"page"`       //当前页码
	PageSize  int `json:"page_size"`  //每页数量
	PageTotal int `json:"page_total"` //总页码
	ItemTotal int `json:"item_total"` //总记录数
}

func NewPagination(page, pageSize int, itemTotal int64) *Pagination {
	var pagination *Pagination
	pagination = new(Pagination)
	return pagination.setPage(page).setPageSize(pageSize).setItemTotal(int(itemTotal))
}

func (p *Pagination) setPage(page int) *Pagination {
	if page <= 0 {
		p.Page = 1
	} else {
		p.Page = page
	}

	return p
}

func (p *Pagination) setPageSize(pageSize int) *Pagination {

	if pageSize > 500 {
		p.PageSize = 500
	} else if pageSize <= 0 {
		p.PageSize = 20
	} else {
		p.PageSize = pageSize
	}
	return p
}

func (p *Pagination) setItemTotal(itemTotal int) *Pagination {
	p.ItemTotal = itemTotal
	p.PageTotal = int(math.Ceil(float64(p.ItemTotal) / float64(p.PageSize)))
	if p.Page > p.PageTotal {
		p.Page = p.PageTotal
	}
	return p
}

func (p *Pagination) GetOffset() int {
	return (p.Page - 1) * p.PageSize
}

func (p *Pagination) GetLimit() int {
	return p.PageSize
}
func (p *Pagination) Paginate() func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		return db.Offset(p.GetOffset()).Limit(p.GetLimit())
	}
}
